﻿using ATEC.ATCore;
using ATEC.ATDataCoreNET;
using ATEC.ATDataCoreNET.ATObjects;
using ATEC.GeometryNET;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EntityExample
{
    /// <summary>
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/实体
    /// 内容：玄镜BIM图形平台上，创建三维实体(SolidCoreEntity)的例子
    /// </summary>
    public class EntityMethod
    {
        /// <summary>
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/实体/创建/圆台体。
        /// 功能：创建圆台体
        /// 关键类及说明：
        ///     SolidCoreEntity: 玄镜平台实体对象
        ///     SSDPNET.DataCore.EntityUtl: 玄镜平台实体操作类
        ///     SSDPNET.DataCore.EntityUtl.Create: 玄镜平台实体操作类，包含创建功能
        /// 关键方法：
        ///     SSDPNET.DataCore.EntityUtl.Create.EntityFromLoft: 通过 Loft 方法创建实体
        /// </summary>
        /// <returns> SolidCoreEntity </returns>
        private static SolidCoreEntity GetCircularBody()
        {
            // 准备截面
            CurveSet profileCircle = DrawCircleAndTransform.MakeCircle();
            CurveSet profileCopy = DrawCircleAndTransform.TransformCircle(profileCircle);
            List<CurveSet> listProfiles = new List<CurveSet> { profileCircle, profileCopy };

            // loft造体
            SolidCoreEntity circularBody = null;
            SSDPNET.DataCore.EntityUtl.Create.EntityFromLoft(out circularBody, listProfiles, null, Session.Entity.GetActiveATScenes(), false, false);
            return circularBody;
        }

        /// <summary>
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/实体/创建/立方体体。
        /// 功能：创建立方体体
        /// 关键类及说明：
        ///     SolidCoreEntity: 玄镜平台实体对象
        ///     SSDPNET.DataCore.EntityUtl: 玄镜平台实体操作类
        ///     SSDPNET.DataCore.EntityUtl.Create: 玄镜平台实体操作类中，负责创建的类
        /// 关键方法：
        ///     SSDPNET.DataCore.EntityUtl.Create.EntityFromSweep: 通过 Sweep 方法创建实体
        /// </summary>
        /// <returns> SolidCoreEntity </returns>
        private static SolidCoreEntity GetCuboidBody()
        {
            // 准备截面
            XPoint3d pt1 = XPoint3d.FromXYZ(0, -25000, 0); // 创建第一个点
            XPoint3d pt2 = XPoint3d.FromXYZ(25000, -25000, 0); // 创建第二个点
            XPoint3d pt3 = XPoint3d.FromXYZ(25000, 25000, 0); // 创建第三个点
            XPoint3d pt4 = XPoint3d.FromXYZ(0, 25000, 0); // 创建第四个点
            List<XPoint3d> pts = new List<XPoint3d> { pt1, pt2, pt3, pt4, pt1 }; // 创建点列表，闭合截面
            CurveSet profile = CurveSet.CreateLinear(pts, CurveSet.BoundaryType.Outer, true); // 创建线性截面

            // 定义路径
            XPoint3d pathPt1 = XPoint3d.FromXYZ(0, 0, 0); // 创建路径起点
            XPoint3d pathPt2 = XPoint3d.FromXYZ(0, 0, 10000); // 创建路径终点
            List<XPoint3d> pathPts = new List<XPoint3d> { pathPt1, pathPt2 }; // 创建路径点列表
            CurveSet path = CurveSet.CreateLinear(pathPts, CurveSet.BoundaryType.Open, true); // 创建线性路径
            SolidCoreEntity cuboidBody = null; // 初始化立方体实体对象
            SSDPNET.DataCore.EntityUtl.Create.EntityFromSweep(
                out cuboidBody, // 输出参数，存储创建的实体
                profile, // 截面
                path, // 路径
                Session.Entity.GetActiveATScenes(), // 获取当前活动场景
                alignParallel:false, // 多截面间是否保持平行。false: 不平行，表示截面随路线转动.
                selfRepair:true, // 修复自相交
                createSheet:false, // true: 表示强制创建薄片体
                lockDirection:null, // 
                twistAngle:null, // 
                scale:null, // 
                scalePoint:null // 
            ); // 使用 Sweep 方法创建实体
            return cuboidBody; // 返回创建的立方体实体
        }

        /// <summary>
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/实体/创建/创建体。
        /// 功能：创建并添加圆台和长方体到场景中。
        /// 关键类及说明：
        ///     SolidCoreEntity: 玄镜平台实体对象
        ///     ATObject: 玄镜平台对象类，表示添加到场景中的物体
        ///     GeometryToATObject: 将几何体转换为 ATObject 对象的工具类
        ///     Session: 当前会话对象，管理与场景相关的操作
        /// 关键方法：
        ///     GetCircularBody: 获取圆台实体
        ///     GetCuboidBody: 获取长方体实体
        ///     GeometryToATObject.ToObject: 将实体转换为 ATObject 对象，并添加到场景
        /// </summary>
        public static void CreateBody()
        {
            // 创建圆台
            SolidCoreEntity circularBody = GetCircularBody(); // 获取圆台体的实体
            ATObject circularObj = GeometryToATObject.ToObject(Session.Entity.GetActiveATScenes(), circularBody, null); // 将圆台体实体转换为 ATObject 对象
            if (circularObj.IsValid) // 检查圆台对象是否有效
                circularObj.AddToScene(); // 将有效的圆台对象添加到场景中

            // 创建长方体
            SolidCoreEntity cuboidBody = GetCuboidBody(); // 获取长方体的实体
            ATObject cuboidObj = GeometryToATObject.ToObject(Session.Entity.GetActiveATScenes(), cuboidBody, null); // 将长方体实体转换为 ATObject 对象
            if (cuboidObj.IsValid) // 检查长方体对象是否有效
                cuboidObj.AddToScene(); // 将有效的长方体对象添加到场景中
        }


        enum BooleanEnum
        {
            Intersect = 0,//求交
            Subtract,//求差
            Union//求并
        };

        /// <summary>
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/实体/修改/布尔运算示例。
        /// 功能：演示如何使用布尔运算（交集、差集、并集）对两个几何体进行操作。
        /// 关键类及说明：
        ///     SolidCoreEntity: 玄镜平台实体对象
        ///     BooleanEnum: 布尔运算类型枚举，定义了交集、差集和并集等操作
        ///     SSDPNET.DataCore.EntityUtl.Modify: 玄镜平台中用于实体修改的工具类，包含布尔运算功能
        ///     GeometryToATObject: 将几何体转换为 ATObject 对象并添加到场景
        ///     ATObject: 玄镜平台对象类，表示添加到场景中的物体
        ///     Session: 当前会话对象，管理与场景相关的操作
        /// 关键方法：
        ///     GetCircularBody: 获取圆台体实体
        ///     GetCuboidBody: 获取长方体实体
        ///     SSDPNET.DataCore.EntityUtl.Modify.BooleanIntersect: 计算两个实体的交集
        ///     SSDPNET.DataCore.EntityUtl.Modify.BooleanSubtract: 计算两个实体的差集
        ///     SSDPNET.DataCore.EntityUtl.Modify.BooleanUnion: 计算两个实体的并集
        ///     GeometryToATObject.ToObject: 将实体转换为 ATObject 对象，并添加到场景
        /// </summary>
        /// <param name="booleanEnum">指定布尔运算的类型（交集、差集、并集）</param>
        /// <returns>返回操作状态（成功或错误）</returns>
        private static ATECStatus BooleanExample(BooleanEnum booleanEnum)
        {
            SolidCoreEntity circularBody = GetCircularBody(); // 获取圆台体的实体
            SolidCoreEntity cuboidBody = GetCuboidBody(); // 获取长方体的实体
            List<SolidCoreEntity> tools = new List<SolidCoreEntity> { circularBody }; // 创建工具列表，这里将圆台体作为操作工具
            ATECStatus status = ATECStatus.Error; // 初始化状态为错误，操作完成后会更新

            // 根据布尔运算类型执行不同的操作
            switch (booleanEnum)
            {
                case BooleanEnum.Intersect:
                    status = SSDPNET.DataCore.EntityUtl.Modify.BooleanIntersect(out cuboidBody, out tools); // 计算交集
                    break;
                case BooleanEnum.Subtract:
                    status = SSDPNET.DataCore.EntityUtl.Modify.BooleanSubtract(out cuboidBody, out tools); // 计算差集
                    break;
                case BooleanEnum.Union:
                    status = SSDPNET.DataCore.EntityUtl.Modify.BooleanUnion(out cuboidBody, out tools); // 计算并集
                    break;
                default:
                    break; // 默认情况下不执行任何操作
            }

            ATObject cuboidObj = GeometryToATObject.ToObject(Session.Entity.GetActiveATScenes(), cuboidBody, null); // 将布尔运算后的长方体体转换为 ATObject 对象
            if (cuboidObj.IsValid) // 如果生成的对象有效
                cuboidObj.AddToScene(); // 将对象添加到当前场景中

            return ATECStatus.Success; // 返回成功状态
        }


        /// <summary>
        /// 求交
        /// </summary>
        public static void BooleanIntersectExample()
        {
            BooleanExample(BooleanEnum.Intersect);
        }

        /// <summary>
        /// 求并
        /// </summary>
        public static void BooleanUnionExample()
        {
            BooleanExample(BooleanEnum.Union);
        }

        /// <summary>
        /// 求差
        /// </summary>
        public static void BooleanSubtractExample()
        {
            BooleanExample(BooleanEnum.Subtract);
        }

        /// <summary>
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/实体/修改/倒圆角示例。
        /// 功能：演示如何对长方体的边进行倒圆角操作。
        /// 关键类及说明：
        ///     SolidCoreEntity: 玄镜平台实体对象
        ///     SSDPNET.DataCore.SubEntity: 玄镜平台子实体对象，用于表示几何体的边、面等部分
        ///     SSDPNET.DataCore.EntityUtl: 玄镜平台实体操作工具类，提供实体修改功能
        ///     GeometryToATObject: 将几何体转换为 ATObject 对象并添加到场景
        ///     ATObject: 玄镜平台对象类，表示添加到场景中的物体
        ///     Session: 当前会话对象，管理与场景相关的操作
        /// 关键方法：
        ///     GetCuboidBody: 获取长方体实体
        ///     SSDPNET.DataCore.EntityUtl.GetEntityEdges: 获取实体的所有边
        ///     SSDPNET.DataCore.EntityUtl.Modify.BlendEdges: 对指定的边进行倒圆角操作
        ///     GeometryToATObject.ToObject: 将实体转换为 ATObject 对象，并添加到场景
        /// </summary>
        public static void BlendEdgesExample()
        {
            // 创建长方体
            SolidCoreEntity cuboidBody = GetCuboidBody(); // 获取长方体实体
            List<SSDPNET.DataCore.SubEntity> edges; // 定义一个列表，用于存储长方体的边
            SSDPNET.DataCore.EntityUtl.GetEntityEdges(out edges, cuboidBody); // 获取长方体实体的所有边，并存储在 edges 列表中
            int edgesCount = edges.Count; // 获取边的数量
            List<double> radii = new List<double>(); // 创建一个列表，用于存储每条边的圆角半径

            // 为每条边设置相同的圆角半径
            for (int i = 0; i < edgesCount; ++i)
            {
                radii.Add(1500); // 每条边的圆角半径设置为 1500
            }

            // 对每条边执行倒圆角操作
            SSDPNET.DataCore.EntityUtl.Modify.BlendEdges(out cuboidBody, edges, radii, propagateSmooth:true); // 对长方体的边应用圆角
            ATObject cuboidObj = GeometryToATObject.ToObject(Session.Entity.GetActiveATScenes(), cuboidBody, null); // 将倒圆角后的长方体实体转换为 ATObject 对象
            if (cuboidObj.IsValid) // 检查转换后的对象是否有效
                cuboidObj.AddToScene(); // 如果有效，将对象添加到当前场景中
        }


        /// <summary>
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/实体/修改/面剪切示例。
        /// 功能：演示如何通过面剪切操作对长方体进行裁切。
        /// 关键类及说明：
        ///     SolidCoreEntity: 玄镜平台实体对象
        ///     CurveSet: 玄镜平台表示曲线集合的类，用于定义截面和路径
        ///     XPoint3d, XRay3d, XTransform3d: 用于定义点、射线和变换的类
        ///     SSDPNET.DataCore.EntityUtl.Modify: 玄镜平台实体修改工具类，提供布尔运算功能
        ///     ATObject: 玄镜平台对象类，表示添加到场景中的物体
        ///     GeometryToATObject: 将几何体转换为 ATObject 对象并添加到场景
        ///     Session: 当前会话对象，管理与场景相关的操作
        /// 关键方法：
        ///     GetCuboidBody: 获取长方体实体
        ///     CurveSet.CreateLinear: 创建一个线性曲线集（用于定义面）
        ///     SSDPNET.DataCore.EntityUtl.Modify.BooleanCut: 对实体执行面剪切操作
        ///     SSDPNET.DataCore.EntityUtl.Modify.TransformEntity: 对实体执行变换操作（如平移）
        ///
        /// </summary>
        public static void BooleanCutExample()
        {
            // 创建剪切面
            /*
                pt4--------<---------pt3                                                    
                 |                   |                                                            
                 |         0         |  面的位置和形状定义，通过四个点描述一个矩形
                 |                   |                                                            
                pt1-------->---------pt2                                                    
            */
            XPoint3d pt1 = XPoint3d.FromXYZ(-25000, -25000, 0); // 定义第一个点 pt1 (x, y, z)
            XPoint3d pt2 = XPoint3d.FromXYZ(25000, -25000, 0); // 定义第二个点 pt2 (x, y, z)
            XPoint3d pt3 = XPoint3d.FromXYZ(25000, 25000, 0); // 定义第三个点 pt3 (x, y, z)
            XPoint3d pt4 = XPoint3d.FromXYZ(-25000, 25000, 0); // 定义第四个点 pt4 (x, y, z)
            List<XPoint3d> pts = new List<XPoint3d> { pt1, pt2, pt3, pt4, pt1 }; // 组成一个矩形的四个点
            CurveSet profile = CurveSet.CreateLinear(pts, CurveSet.BoundaryType.Outer, true); // 创建表示该矩形的线性曲线集合

            // 创建射线，作为旋转的基础
            XRay3d rayY = XRay3d.FromOriginAndDirection(XPoint3d.Zero, XVector3d.UnitY); // 定义一个射线（原点在(0, 0, 0)，方向沿Y轴）
            XTransform3d rotTrans = SSDPNET.Geom.XTransform3dExtension.FromAxisAndRotationAngle(rayY, -(XAngle.PI * 0.25).Radians); // 创建绕Y轴旋转 -45 度的旋转变换
            XTransform3d translation = XTransform3d.FromTranslation(XPoint3d.FromXYZ(0, 0, 5000)); // 创建一个平移变换，将面沿Z轴平移 5000 单位
            XTransform3d trans = XTransform3d.Multiply(translation, rotTrans); // 将旋转和平移变换合并
            profile.Transform(trans); // 对面进行变换（旋转和平移）

            ATObject profileObject = ATEC.ATDataCoreNET.ATObjects.GeometryToATObject.ToObject(Session.Entity.GetActiveATScenes().GetATScene(), profile, null); // 将变换后的面转换为 ATObject 对象
            profileObject.AddToScene(); // 将面添加到场景中

            // 创建长方体
            SolidCoreEntity cuboidBody = GetCuboidBody(); // 获取长方体实体
            ATObject cuboidObj = GeometryToATObject.ToObject(Session.Entity.GetActiveATScenes(), cuboidBody, null); // 将长方体实体转换为 ATObject 对象
            if (cuboidObj.IsValid) // 如果长方体对象有效
                cuboidObj.AddToScene(); // 将长方体添加到场景中

            // 执行面剪切操作
            SSDPNET.DataCore.EntityUtl.Modify.BooleanCut(out cuboidBody, 
                profile,
                SSDPNET.DataCore.EntityUtl.Modify.CutDirectionMode.Forward, // 执行面剪切操作，剪切方向为前向，与切面法向相同
                SSDPNET.DataCore.EntityUtl.Modify.CutDepthMode.All, // 切割深度，All 表示切穿
                distance:0, // 切口深度，选 CutDepthMode.Blind 时有效
                invert:false,
                defaultNormal:null,
                nodeId:0); 

            // 偏移，方便对比查看结果
            XTransform3d xTranslation = XTransform3d.FromTranslation(XPoint3d.FromXYZ(40000, 0, 0)); // 创建一个平移变换，将剪切后的物体沿X轴平移 40000 单位
            SSDPNET.DataCore.EntityUtl.Modify.TransformEntity(out cuboidBody, xTranslation); // 对长方体执行平移变换
            cuboidObj = GeometryToATObject.ToObject(Session.Entity.GetActiveATScenes(), cuboidBody, null); // 将变换后的长方体实体转换为 ATObject 对象
            if (cuboidObj.IsValid) // 如果变换后的对象有效
                cuboidObj.AddToScene(); // 将对象添加到场景中
        }


        /// <summary>
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/实体/创建/缝合体示例。 
        /// 功能：演示如何通过创建多个截面并将它们缝合，形成一个闭合的三维体。此方法演示了如何通过截面数据构建几何体，并通过缝合操作生成完整的实体。
        /// 关键类及说明：
        ///     SolidCoreEntity: 玄镜平台实体对象，用于表示几何体。
        ///     CurveSet: 用于定义截面的类，支持线性和曲线截面。
        ///     XPoint3d: 表示三维空间中的点。
        ///     ATECStatus: 枚举类型，表示操作的成功或失败状态。
        ///     ATObject: 玄镜平台对象类，表示添加到场景中的物体。
        ///     GeometryToATObject: 用于将几何体转换为 ATObject 对象并添加到场景。
        ///     SSDPNET.DataCore.EntityUtl: 玄镜平台实体操作工具类，提供创建、修改实体等功能。
        ///     Session: 当前会话对象，管理与场景相关的操作。
        /// 关键方法：
        ///     SSDPNET.DataCore.EntityUtl.Create.EntityFromCurveSet: 根据截面曲线创建实体。
        ///     SSDPNET.DataCore.EntityUtl.Modify.SewEntitys: 执行实体缝合操作，将多个截面缝合成一个完整的实体。
        /// </summary>
        public static void SewBodiesExample()
        {
            double length = 20000; // 长方体的长度
            double width = 10000; // 长方体的宽度
            double height = 10000; // 长方体的高度

            // 构造截面1数据(左截面)
            XPoint3d profile1Pt1 = XPoint3d.FromXYZ(-length, width, 0); // 定义左截面第一个点
            XPoint3d profile1Pt2 = XPoint3d.FromXYZ(-length, -width, 0); // 定义左截面第二个点
            XPoint3d profile1Pt3 = XPoint3d.FromXYZ(-length, -width, height); // 定义左截面第三个点
            XPoint3d profile1Pt4 = XPoint3d.FromXYZ(-length, width, height); // 定义左截面第四个点
            List<XPoint3d> profile1Pts = new List<XPoint3d> { profile1Pt1, profile1Pt2, profile1Pt3, profile1Pt4, profile1Pt1 }; // 将点列表化成一个闭合的截面
            CurveSet profile1 = CurveSet.CreateLinear(profile1Pts, CurveSet.BoundaryType.Outer, true); // 创建左截面的线性曲线集合

            // 构造截面2数据（前截面）
            XPoint3d profile2Pt1 = XPoint3d.FromXYZ(-length, -width, 0); // 定义前截面第一个点
            XPoint3d profile2Pt2 = XPoint3d.FromXYZ(length, -width, 0); // 定义前截面第二个点
            XPoint3d profile2Pt3 = XPoint3d.FromXYZ(length, -width, height); // 定义前截面第三个点
            XPoint3d profile2Pt4 = XPoint3d.FromXYZ(-length, -width, height); // 定义前截面第四个点
            List<XPoint3d> profile2Pts = new List<XPoint3d> { profile2Pt1, profile2Pt2, profile2Pt3, profile2Pt4, profile2Pt1 }; // 将点列表化成一个闭合的截面
            CurveSet profile2 = CurveSet.CreateLinear(profile2Pts, CurveSet.BoundaryType.Outer, true); // 创建前截面的线性曲线集合

            // 构造截面3数据（右截面）
            XPoint3d profile3Pt1 = XPoint3d.FromXYZ(length, -width, 0); // 定义右截面第一个点
            XPoint3d profile3Pt2 = XPoint3d.FromXYZ(length, width, 0); // 定义右截面第二个点
            XPoint3d profile3Pt3 = XPoint3d.FromXYZ(length, width, height); // 定义右截面第三个点
            XPoint3d profile3Pt4 = XPoint3d.FromXYZ(length, -width, height); // 定义右截面第四个点
            List<XPoint3d> profile3Pts = new List<XPoint3d> { profile3Pt1, profile3Pt2, profile3Pt3, profile3Pt4, profile3Pt1 }; // 将点列表化成一个闭合的截面
            CurveSet profile3 = CurveSet.CreateLinear(profile3Pts, CurveSet.BoundaryType.Outer, true); // 创建右截面的线性曲线集合

            // 构造截面4数据（后截面）
            XPoint3d profile4Pt1 = XPoint3d.FromXYZ(length, width, 0); // 定义后截面第一个点
            XPoint3d profile4Pt2 = XPoint3d.FromXYZ(-length, width, 0); // 定义后截面第二个点
            XPoint3d profile4Pt3 = XPoint3d.FromXYZ(-length, width, height); // 定义后截面第三个点
            XPoint3d profile4Pt4 = XPoint3d.FromXYZ(length, width, height); // 定义后截面第四个点
            List<XPoint3d> profile4Pts = new List<XPoint3d> { profile4Pt1, profile4Pt2, profile4Pt3, profile4Pt4, profile4Pt1 }; // 将点列表化成一个闭合的截面
            CurveSet profile4 = CurveSet.CreateLinear(profile4Pts, CurveSet.BoundaryType.Outer, true); // 创建后截面的线性曲线集合

            // 构造截面5数据（底截面）
            XPoint3d profile5Pt1 = XPoint3d.FromXYZ(-length, width, 0); // 定义底截面第一个点
            XPoint3d profile5Pt2 = XPoint3d.FromXYZ(-length, -width, 0); // 定义底截面第二个点
            XPoint3d profile5Pt3 = XPoint3d.FromXYZ(length, -width, 0); // 定义底截面第三个点
            XPoint3d profile5Pt4 = XPoint3d.FromXYZ(length, width, 0); // 定义底截面第四个点
            List<XPoint3d> profile5Pts = new List<XPoint3d> { profile5Pt1, profile5Pt2, profile5Pt3, profile5Pt4, profile5Pt1 }; // 将点列表化成一个闭合的截面
            CurveSet profile5 = CurveSet.CreateLinear(profile5Pts, CurveSet.BoundaryType.Outer, true); // 创建底截面的线性曲线集合

            // 构造截面6数据（顶截面）
            XPoint3d profile6Pt1 = XPoint3d.FromXYZ(-length, width, height); // 定义顶截面第一个点
            XPoint3d profile6Pt2 = XPoint3d.FromXYZ(-length, -width, height); // 定义顶截面第二个点
            XPoint3d profile6Pt3 = XPoint3d.FromXYZ(length, -width, height); // 定义顶截面第三个点
            XPoint3d profile6Pt4 = XPoint3d.FromXYZ(length, width, height); // 定义顶截面第四个点
            List<XPoint3d> profile6Pts = new List<XPoint3d> { profile6Pt1, profile6Pt2, profile6Pt3, profile6Pt4, profile6Pt1 }; // 将点列表化成一个闭合的截面
            CurveSet profile6 = CurveSet.CreateLinear(profile6Pts, CurveSet.BoundaryType.Outer, true); // 创建顶截面的线性曲线集合

            // 创建薄片
            List<CurveSet> profileCrvs = new List<CurveSet> { profile1, profile2, profile3, profile4, profile5, profile6 }; // 将所有截面放入一个列表
            List<SolidCoreEntity> profileEntities = new List<SolidCoreEntity>(); // 用于存放创建的实体

            foreach (CurveSet profileCrv in profileCrvs) // 遍历每个截面，生成对应的实体
            {
                SolidCoreEntity solid;
                ATECStatus sattus = SSDPNET.DataCore.EntityUtl.Create.EntityFromCurveSet(out solid, profileCrv, Session.Entity.GetActiveATScenes()); // 从截面创建实体
                if (sattus == ATECStatus.Success) // 如果创建成功
                    profileEntities.Add(solid); // 将实体添加到列表中
            }

            // 缝合体
            List<SolidCoreEntity> sewn = new List<SolidCoreEntity>(); // 缝合后的实体列表
            List<SolidCoreEntity> unsewn = new List<SolidCoreEntity>(); // 未缝合的实体列表
            SSDPNET.DataCore.EntityUtl.Modify.SewEntitys(out sewn, out unsewn,
                tools: out profileEntities,
                gapWidthBound: 100, // 设置缝合的最大间隙为100
                nIterations: 1); // 设置缝合的迭代次数为1

            foreach (SolidCoreEntity solid in sewn) // 遍历所有缝合后的实体
            {
                ATObject obj = GeometryToATObject.ToObject(Session.Entity.GetActiveATScenes(), solid, null); // 将实体转换为 ATObject 对象
                if (obj.IsValid) // 如果转换后的对象有效
                    obj.AddToScene(); // 将对象添加到场景中
            }
        }

        /// <summary>
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/实体/顶点提取示例。 
        /// 功能：演示如何从一个三维实体（例如长方体）中提取顶点，并在场景中绘制表示这些顶点的小点。此方法首先创建一个长方体实体，然后提取其顶点，并在每个顶点位置上绘制一个小圆点。 
        /// 关键类及说明：
        ///     SolidCoreEntity: 玄镜平台实体对象，用于表示几何体。
        ///     ATObject: 玄镜平台对象类，表示添加到场景中的物体。
        ///     SSDPNET.DataCore.SubEntity: 表示实体的子元素，例如顶点、边、面等。
        ///     XPoint3d: 表示三维空间中的点。
        ///     BasicCurve: 表示基本的几何曲线，支持不同类型的曲线（如圆弧）。
        ///     CurveSet: 用于集合多个曲线形成封闭或开放的曲线集合。
        ///     ATECStatus: 枚举类型，表示操作的成功或失败状态。
        ///     SSDPNET.DataCore.EntityUtl.GetEntityVertices: 获取实体的所有顶点。
        ///     SSDPNET.DataCore.EntityUtl.EvaluateVertex: 从子实体中评估顶点的位置。
        /// </summary>
        public static void EvaluateVertexExample()
        {
            // 创建长方体
            SolidCoreEntity cuboidBody = GetCuboidBody(); // 调用方法获取长方体实体
            ATObject cuboidObj = GeometryToATObject.ToObject(Session.Entity.GetActiveATScenes(), cuboidBody, null); // 将长方体实体转换为ATObject对象以便添加到场景中
            if (cuboidObj.IsValid) // 判断转换后的对象是否有效
                cuboidObj.AddToScene(); // 如果有效，将长方体对象添加到当前场景中

            // 提取顶点的SubEntity
            List<SSDPNET.DataCore.SubEntity> vertices = new List<SSDPNET.DataCore.SubEntity>(); // 创建一个列表用于存储顶点子实体
            SSDPNET.DataCore.EntityUtl.GetEntityVertices(out vertices, cuboidBody); // 从长方体实体中提取所有顶点的子实体并存储在列表中

            foreach (SSDPNET.DataCore.SubEntity subentity in vertices) // 遍历每个提取的顶点子实体
            {
                // 提取顶点
                XPoint3d pt = XPoint3d.Zero; // 初始化顶点的三维坐标，默认值为零
                if (ATECStatus.Success != SSDPNET.DataCore.EntityUtl.EvaluateVertex(subentity, out pt)) // 调用EvaluateVertex方法评估子实体（顶点）的实际坐标
                    continue; // 如果评估失败，则跳过当前顶点

                // 绘制点
                XEllipse3d ellips = XEllipse3d.FromCenterRadiusXY(pt, 1000); // 根据顶点坐标创建一个半径为1000的椭圆（作为点的可视化表示）
                BasicCurve pBaisc = BasicCurve.CreateArc(ellips); // 将椭圆转换为基本的弧形曲线
                CurveSet pCv = CurveSet.Create(CurveSet.BoundaryType.Outer); // 创建一个新的曲线集合，用于存放绘制的曲线
                pCv.Add(pBaisc); // 将弧形曲线添加到曲线集合中

                ATObject Obj = ATEC.ATDataCoreNET.ATObjects.GeometryToATObject.ToObject(Session.Entity.GetActiveATScenes(), pCv, null); // 将曲线集合转换为ATObject对象以便添加到场景中
                Obj.AddToScene(); // 将绘制的顶点（小点）对象添加到场景中
            }
        }

    }
}
